#include <signal.h> int (*signal(sig, func)(); int sig; значение сигнала int (*func)(); выполняемая функция
Описание.
Функция signal позволяет выбрать из операционной системы один из трех способов обработки сигнала прерывания. Аргумент sig может быть одной из манифестных констант SIGINT или SIGFPE , определеных в <signal.h> . Манифестная константа SIGINT соответствует в MS DOS сигналу прерывания INT 23H . SIGFPE соответствует прерываниям плавающей точки, которые не маскированы, такие как переполнение, деление на ноль, неверная операция. Аргумент func может быть одной из манифестных констант SIG_DFL или SIG_IGN (также определенных в <signal.h> ), или адресом функции. При получении сигнала прерывания принимаемое действие зависит от значения func и является следующим:
ЗНАЧЕНИЕ ЕГО СМЫСЛ
SIG_IGN Сигнал прерывания игнорируется. Это
значение для SIGFPE не задается, т.к.
состояние процесса с плавающей точкой
остается неопределенным.
SIG_DFL Вызванный процесс завершен; управление
передается на уровень команд MS DOS.
Все файлы, открытые в процессе, закры-
ваются, но буферы не обновляются.
Адрес функции Для сигналов SIGINT функции, на которую
указывает func, передается аргумент
SIGINT и она выполняется. Если функция
завершается нормально, прерванный про-
цесс возобновляет выполнение с команды,
следующей за той, в которой был получен
сигнал прерывания. Перед выполнением
специфицированной функции значение func
устанавливается в SIG_DFL; следующий
сигнал прерывания трактуется как и для
SIG_DFL, если внешний вызов signal,
задающий другое значение прерывания, не
определен. Это позволяет пользователю
переустанавливать сигналы в вызываемых
функциях, если необходимо. Для SIGFPE
функциц, на которую указывает func,
передаются два аргумента - SIGFPE и це-
лый подкод ошибки, FPE-xxx-, и затем
она выполняется. (Смотрите include-файл
<float.h> для определения подкодов
FPE-xxx.) Значение func не
переустановится до тех пор, пока не
будет получен сигнал прерывания; для
выхода из состояния плавающей точки
используется setjmp вместе с longjmp
(см. пример для функции_fprset). Если
функция завершается нормально, прерван-
ный процесс возобновляется в
неопределенном состоянии плавающей
точки.
Возвращаемое значение.
Функция signal возвращает предыдущее значение func . Возвращаемое значение -1 свидетельствует об ошибке и errno устанавливается в EINVAL , определяя неверное значение sig .
Замечание:
В тех child -процессах, которые созданы посредством вызова процедур exec или spawn , установленные сигналы прерываний не сохраняются. Эти сигналы в child-процессе переустанавливаются по умолчанию.
Пример:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <process.h>
int handler();
main()
{
if(signal(SIGINT, handler)==(int(*)())-1) {
fprintf(stderr,"couldn't set SIGINT\n");
abort();
}
.
.
.
}
int handler()
{
char ch;
printf("terminate processing? ");
scanf("%1c", &ch);
if (ch=='y' ::ch=='Y')
exit(0);
signal(SIGINT, handler);
}
/* функция signal, вызванная здесь для следующего сигнала
прерываний, посылает управление не в ОС, а к handler() */